/**
 * @file datagramBuffer.c
 * @brief Implementación de las funciones del modulo auxiliar msgData.
 *
 * Fichero que contiene el cuerpo de las funciones de gestion del almacenamiento de datagramas.
 */

#include "msgData.h"

struct _msgData{
	BYTE *msg;				/*!< Array de BYTE's del mensaje*/
	size_t size;			/*!< Tamanno del mensaje*/
};

MSG_DATA iniMsgData()
{
	MSG_DATA msgData=NULL;
	
	msgData=(struct _msgData *) calloc(1, sizeof(struct _msgData));
	if(msgData==NULL){
		return NULL;
	}
	
	msgData->msg=NULL;
	msgData->size=0;
	
	return msgData;
}

void freeMsgData(MSG_DATA msgData)
{
	if(msgData!=NULL){
		free(msgData);
	}
	
	return;
}

void cleanMsgData(MSG_DATA msgData)
{
	if(msgData==NULL){
		return;
	}
	
	if(msgData->msg!=NULL){		/* Libera la memoria requisada, en caso de existir alocacion*/
		free(msgData->msg);
	}
	
	msgData->msg=NULL;
	msgData->size=0;
}

ERR_CODE insertMsgData(MSG_DATA msgData, BYTE *msg, size_t size)
{
	if(msgData==NULL){
		return ERR;
	}
	
	cleanMsgData(msgData);		/* Limpia el mensaje anterior (Si existe)*/
	
	msgData->msg=(BYTE *)calloc(size, sizeof(BYTE));
	if(msgData->msg==NULL){
		return ERR;
	}
	
	memcpy(msgData->msg, msg, size);
	msgData->size=size;
	
	return OK;
}

BYTE *getMsgMsgData(MSG_DATA msgData)
{
	if(msgData==NULL){
		return NULL;
	}
	
	return msgData->msg;
}

size_t getSizeMsgData(MSG_DATA msgData)
{
	if(msgData==NULL){
		return 0;
	}
	
	return msgData->size;
}

ERR_CODE cpyMsgData(MSG_DATA dst, MSG_DATA src)
{
	if(dst==NULL || src==NULL){
		return ERR;
	}
	
	cleanMsgData(dst);		/* Limpia dst (Si existe mensaje previo) */
	
	dst->size=src->size;
	dst->msg=(BYTE *)calloc(dst->size, sizeof(BYTE));
	if(dst->msg==NULL){
		return ERR;
	}
	
	if(memcpy(dst->msg, src->msg, dst->size)==NULL){
		cleanMsgData(dst);
		return ERR;
	}
	
	return OK;
}

